#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
class Solution
{
public:
    string bestHand(vector<int> &ranks, vector<char> &suits)
    {

        // flush
        auto isFlush = [](vector<char> arr) -> bool
        {
            for (int i = 0; i < arr.size() - 1; i++)
            {

                if (arr[i] != arr[i + 1])
                    return false;
            }
            return true;
        };

        //
        unordered_map<int, int> ranksMap;
        for (int rank : ranks)
        {
            ranksMap[rank]++;
        }
        vector<int> ans;
        for (auto &[k, v] : ranksMap)
        {
            ans.push_back(v);
        }
        int rankSize = ranksMap.size();
        if (isFlush(suits))
        {
            return "Flush";
        }
        else
        {
            switch (rankSize)
            {
            case 5:
                return "High Card";
                break;
            case 4:
                return "Pair";
            case 3:
                if (find(ans.begin(), ans.end(), 3) != ans.end())
                {
                    return "Three of a Kind";
                }
                else
                {
                    return "Pair";
                }
            case 2:
                return "Three of a Kind";
                break;
            }
        }
        return "";
    }

    /**
     * @brief 全 0 子数组的数目
     *
     * @param nums
     * @return long long
     */
    long long zeroFilledSubarray(vector<int> &nums)
    {
        long long ans = 0;
        for (int i = 0, j = 0; i < nums.size(); i += 1)
        {
            if (nums[i] != 0)
                j = i + 1;
            ans += i - j + 1;
        }
        return ans;
    }
};
class NumberContainers
{
public:
    unordered_map<int, int> indexMap;
    unordered_map<int, set<int>> positionMap;
    NumberContainers()
    {
    }

    void change(int index, int number)
    {
        if (indexMap.count(index))
            positionMap[indexMap[index]].erase(index);
        indexMap[index] = number;
        positionMap[number].insert(index);
    }

    int find(int number)
    {
        if (positionMap[number].empty())
            return -1;
        return *positionMap[number].begin();
    }
};
int main()
{
    Solution s;
    // vector<int> ranks = {1, 1, 2, 2, 9};
    // vector<char> suits = {'b', 'b', 'q', 'b', 'b'};
    // cout << s.bestHand(ranks, suits) << endl;
    NumberContainers nc = NumberContainers();
    cout << nc.find(10) << endl; // 没有数字 10 ，所以返回 -1 。
    nc.change(2, 10);            // 容器中下标为 2 处填入数字 10 。
    nc.change(1, 10);            // 容器中下标为 1 处填入数字 10 。
    nc.change(3, 10);            // 容器中下标为 3 处填入数字 10 。
    nc.change(5, 10);            // 容器中下标为 5 处填入数字 10 。
    cout << nc.find(10) << endl; // 数字 10 所在的下标为 1 ，2 ，3 和 5 。因为最小下标为 1 ，所以返回 1 。
    nc.change(1, 20);            // 容器中下标为 1 处填入数字 20 。注意，下标 1 处之前为 10 ，现在被替换为 20 。
    cout << nc.find(10) << endl; // 数字 10 所在下标为 2 ，3 和 5 。最小下标为 2 ，所以返回 2 。
    system("pause");
    return 0;
}
